﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Retete.Models;
using Retete.ViewModels;
using System.Globalization;
using System.IO;
using System.Text;
using System.Configuration;
using System.Diagnostics;
using Retete.Helpers;

namespace Retete.Controllers
{
    public class ReceptiiController : Controller
    {
        private ReteteEntities entities = new ReteteEntities();

        public ActionResult Index(int? year, int? month, int? day)             // GET: /Receptii/
        {
            DateTime selectedDate = DateTime.Today;

            if (day.HasValue == true) selectedDate = new DateTime(year.Value, month.Value, day.Value);
            List<Receptie> selectieReceptii = entities.Receptii.Where(element => element.Data == selectedDate).OrderByDescending(element => element.Numar).ToList();

            return View(new ReceptiiViewModel(selectieReceptii) { SelectedDate = selectedDate });
        }
        public ActionResult Create()            // GET: /Receptii/Create
        {
            Receptie ultimaReceptie = entities.Receptii.OrderByDescending(element => element.Data).ThenByDescending(element => element.Numar).FirstOrDefault();
            Produs selectie = entities.Produse.OrderByDescending(element => element.Cod).FirstOrDefault();

            if (ultimaReceptie == null) return View(new ReceptieViewModel(new Receptie() { Data = DateTime.Today, Tva = (decimal)0.24, Numar = 1 }) { CodUltimulProdus = selectie == null ? string.Empty : selectie.Cod });
            else if (ultimaReceptie.Data.Month == DateTime.Today.Month && ultimaReceptie.Data.Year == DateTime.Today.Year) return View(new ReceptieViewModel(new Receptie() { Data = DateTime.Today, Tva = ultimaReceptie.Tva, Numar = ultimaReceptie.Numar + 1 }) { CodUltimulProdus = selectie.Cod });
            else return View(new ReceptieViewModel(new Receptie() { Data = DateTime.Today, Tva = ultimaReceptie.Tva, Numar = 1 }) { CodUltimulProdus = selectie.Cod });
        }
        public ActionResult Edit(int id)        // GET: /Receptii/Edit/5
        {
            Receptie selectie = entities.Receptii.FirstOrDefault(element => element.ID == id);
            Produs selectieProdus = entities.Produse.OrderByDescending(element => element.Cod).FirstOrDefault();

            if (selectie == null) return RedirectToAction("Index");
            else return View(new ReceptieViewModel(selectie) { TotalValoare = selectie.CorectieValoare, TotalValoareCuTVA = selectie.CorectieValoareCuTva, TotalValoareTVA = selectie.CorectieValoareTva, CodUltimulProdus = selectieProdus.Cod });
        }

        [HttpPost]
        public ActionResult Index(ReceptiiViewModel result)
        {
            Receptie meniu = entities.Receptii.FirstOrDefault(element => element.ID == result.IDReceptieStearsa);

            if (meniu != null)
            {
                try
                {
                    entities.DeleteObject(meniu);
                    entities.SaveChanges();
                    result.IDReceptieStearsa = -1;

                    return RedirectToAction("Index");
                }
                catch
                {
                    ModelState.AddModelError(string.Empty, "Receptia nu poate fi stearsa");
                    return View(result);
                }
            }
            else return RedirectToAction("Index");
        }

        [HttpPost]
        public ActionResult Create(ReceptieViewModel result)           // POST: /Receptii/Create
        {
            if (result.AdaugaProdusInventar == true)
            {
                result.AdaugaProdusInventar = false;
                result.ProdusNouInventarNume = result.ProdusNouNume;

                return View("AdaugareProdusInventar", result);
            }
            else if (result.FinalizareAdaugareProdusInventar == true)
            {
                if (string.IsNullOrEmpty(result.ProdusNouInventarCod) == true) ModelState.AddModelError("ProdusNouInventarCod", "Codul trebuie completat");
                if (string.IsNullOrEmpty(result.ProdusNouInventarNume) == true) ModelState.AddModelError("ProdusNouInventarNume", "Numele produsului trebuie completat");
                if (string.IsNullOrEmpty(result.ProdusNouInventarUnitateMasura) == true) ModelState.AddModelError("ProdusNouInventarUnitateMasura", "Unitatea de masura trebuie completata");
                if (string.IsNullOrEmpty(result.ProdusNouInventarCategorie) == true) ModelState.AddModelError("ProdusNouInventarCategorie", "Categoria produsului trebuie completata");
                if (entities.Produse.Any(element => element.Cod == result.ProdusNouInventarCod) == true) ModelState.AddModelError("ProdusNouInventarCod", "Mai exista un produs cu acest cod");

                if (ModelState.IsValid == true)
                {
                    Produs nou = new Produs() { Cod = result.ProdusNouInventarCod, Categorie = result.ProdusNouInventarCategorie, Nume = result.ProdusNouInventarNume, UnitateMasura = result.ProdusNouInventarUnitateMasura };
                    entities.AddToProduse(nou);
                    entities.SaveChanges();

                    result.FinalizareAdaugareProdusInventar = false;
                    result.FocusProdusNou = true;

                    result.ProdusNouNume = nou.Nume;
                    result.ProdusNouCod = nou.Cod;
                    result.ProdusNouID = nou.ID;
                    ModelState.Clear();

                    return View(result);
                }
                else return View("AdaugareProdusInventar", result);
            }
            else if (result.ExportExcel == true)
            {
                result.ExportExcel = false;
                ModelState.Clear();

                return Content(Rapoarte.GenereazaRaportProfitModificat(result));
            }
            else if (result.IDProdusSters != -1)
            {
                ReceptieProdus produsSters = result.Produse.First(element => element.ID == result.IDProdusSters);
                result.Produse.Remove(produsSters);
                result.IDProdusSters = -1;

                ModelState.Clear();
                return View(result);
            }
            else if (string.IsNullOrEmpty(result.ProdusNouNume) == false)
            {
                if (string.IsNullOrEmpty(result.ProdusNouCod))
                {
                    ModelState.Clear();
                    ModelState.AddModelError("ProdusNouCod", "Codul trebuie sa fie completat");

                    result.AdaugaProdusInventar = true;
                }

                if (ModelState.IsValid == true)
                {
                    if (result.Produse == null) result.Produse = new List<ReceptieProdus>();

                    Produs selectie = entities.Produse.FirstOrDefault(element => element.ID == result.ProdusNouID);
                    ReceptieProdus nou = new ReceptieProdus() { IDProdus = selectie.ID, AdmiteTVA = result.ProdusNouTVA, Gramaj = result.ProdusNouGramaj, Produs = selectie, Cantitate = result.ProdusNouCantitate, PretCumparare = result.ProdusNouPret, Receptie = result.Receptie, PretVanzare = result.ProdusNouPretVanzare };

                    if (result.Produse.Count == 0) nou.ID = 1;
                    else nou.ID = result.Produse.Max(element => element.ID) + 1;
                    result.Produse.Add(nou);

                    result.ProdusNouNume = string.Empty;
                    result.ProdusNouCantitate = 0;
                    result.ProdusNouGramaj = 1;
                    result.ProdusNouPret = 0;
                    result.ProdusNouPretVanzare = 0;
                    result.FocusProdusNou = true;
                    result.ProdusNouTVA = true;
                    result.ProdusNouCod = string.Empty;

                    result.TotalValoare = Math.Round(result.Produse.Sum(element => element.Valoare), 2);
                    result.TotalValoareCuTVA = Math.Round(result.Produse.Sum(element => element.ValoareCuTVA), 2);
                    result.TotalValoareTVA = Math.Round(result.Produse.Sum(element => element.ValoareTVA), 2);

                    ModelState.Clear();
                }

                return View(result);
            }
            else
            {
                if (result.Produse != null)
                {
                    foreach (ReceptieProdus element in result.Produse)
                    {
                        Produs existent = entities.Produse.First(produs => produs.ID == element.IDProdus);
                        result.Receptie.Produse.Add(new ReceptieProdus() { Cantitate = element.Cantitate, AdmiteTVA = element.AdmiteTVA, Gramaj = element.Gramaj, PretCumparare = element.PretCumparare, IDProdus = element.IDProdus, PretVanzare = element.PretVanzare });
                    }
                }

                result.Receptie.CorectieValoare = result.TotalValoare;
                result.Receptie.CorectieValoareCuTva = result.TotalValoareCuTVA;
                result.Receptie.CorectieValoareTva = result.TotalValoareTVA;

                entities.AddToReceptii(result.Receptie);
                entities.SaveChanges();
                return RedirectToAction("Index");
            }
        }

        [HttpPost]
        public ActionResult Edit(int id, ReceptieViewModel result)     // POST: /Receptii/Edit/5
        {
            if (result.AdaugaProdusInventar == true)
            {
                result.AdaugaProdusInventar = false;
                result.ProdusNouInventarNume = result.ProdusNouNume;

                return View("AdaugareProdusInventar", result);
            }
            else if (result.FinalizareAdaugareProdusInventar == true)
            {
                if (string.IsNullOrEmpty(result.ProdusNouInventarCod) == true) ModelState.AddModelError("ProdusNouInventarCod", "Codul trebuie completat");
                if (string.IsNullOrEmpty(result.ProdusNouInventarNume) == true) ModelState.AddModelError("ProdusNouInventarNume", "Numele produsului trebuie completat");
                if (string.IsNullOrEmpty(result.ProdusNouInventarUnitateMasura) == true) ModelState.AddModelError("ProdusNouInventarUnitateMasura", "Unitatea de masura trebuie completata");
                if (string.IsNullOrEmpty(result.ProdusNouInventarCategorie) == true) ModelState.AddModelError("ProdusNouInventarCategorie", "Categoria produsului trebuie completata");

                if (ModelState.IsValid == true)
                {
                    Produs nou = new Produs() { Cod = result.ProdusNouInventarCod, Categorie = result.ProdusNouInventarCategorie, Nume = result.ProdusNouInventarNume, UnitateMasura = result.ProdusNouInventarUnitateMasura };
                    entities.AddToProduse(nou);
                    entities.SaveChanges();

                    result.FinalizareAdaugareProdusInventar = false;
                    result.FocusProdusNou = true;

                    result.ProdusNouNume = nou.Nume;
                    result.ProdusNouCod = nou.Cod;
                    result.ProdusNouID = nou.ID;
                    ModelState.Clear();

                    return View(result);
                }
                else return View("AdaugareProdusInventar", result);
            }
            else if (result.ExportExcel == true)
            {
                result.ExportExcel = false;
                ModelState.Clear();

                return Content(Rapoarte.GenereazaRaportProfitModificat(result));
            }
            else if (result.IDProdusSters != -1)
            {
                ReceptieProdus produsSters = result.Produse.First(element => element.ID == result.IDProdusSters);
                result.Produse.Remove(produsSters);
                result.IDProdusSters = -1;

                ModelState.Clear();
                return View(result);
            }
            else if (string.IsNullOrEmpty(result.ProdusNouNume) == false)
            {
                if (string.IsNullOrEmpty(result.ProdusNouCod))
                {
                    ModelState.Clear();
                    ModelState.AddModelError("ProdusNouCod", "Codul trebuie sa fie completat");

                    result.AdaugaProdusInventar = true;
                }

                if (ModelState.IsValid == true)
                {
                    if (result.Produse == null) result.Produse = new List<ReceptieProdus>();

                    Produs selectie = entities.Produse.FirstOrDefault(element => element.ID == result.ProdusNouID);
                    Receptie receptie = entities.Receptii.First(element => element.ID == id);
                    ReceptieProdus nou = new ReceptieProdus() { IDProdus = selectie.ID, AdmiteTVA = result.ProdusNouTVA, Gramaj = result.ProdusNouGramaj, Produs = selectie, Cantitate = result.ProdusNouCantitate, PretCumparare = result.ProdusNouPret, Receptie = result.Receptie, PretVanzare = result.ProdusNouPretVanzare };

                    if (result.Produse.Count == 0) nou.ID = 1;
                    else nou.ID = result.Produse.Max(element => element.ID) + 1;
                    result.Produse.Add(nou);

                    result.ProdusNouNume = string.Empty;
                    result.ProdusNouCantitate = 0;
                    result.ProdusNouGramaj = 1;
                    result.ProdusNouPret = 0;
                    result.ProdusNouPretVanzare = 0;
                    result.FocusProdusNou = true;
                    result.ProdusNouTVA = true;
                    result.ProdusNouCod = string.Empty;

                    result.TotalValoare = Math.Round(result.Produse.Sum(element => element.Valoare), 2);
                    result.TotalValoareCuTVA = Math.Round(result.Produse.Sum(element => element.ValoareCuTVA), 2);
                    result.TotalValoareTVA = Math.Round(result.Produse.Sum(element => element.ValoareTVA), 2);

                    ModelState.Clear();
                }

                return View(result);
            }
            else
            {
                Receptie selectie = entities.Receptii.First(element => element.ID == id);

                selectie.Data = result.Receptie.Data;
                selectie.FurnizorAdresa = result.Receptie.FurnizorAdresa;
                selectie.FurnizorBanca = result.Receptie.FurnizorBanca;
                selectie.FurnizorCodFiscal = result.Receptie.FurnizorCodFiscal;
                selectie.FurnizorCodRegistruComert = result.Receptie.FurnizorCodRegistruComert;
                selectie.FurnizorCont = result.Receptie.FurnizorCont;
                selectie.FurnizorJudet = result.Receptie.FurnizorJudet;
                selectie.FurnizorNume = result.Receptie.FurnizorNume;
                selectie.Numar = result.Receptie.Numar;
                selectie.Tva = result.Receptie.Tva;
                selectie.CorectieValoare = result.TotalValoare;
                selectie.CorectieValoareCuTva = result.TotalValoareCuTVA;
                selectie.CorectieValoareTva = result.TotalValoareTVA;
                selectie.TipDocumentLivrare = result.Receptie.TipDocumentLivrare;
                selectie.NumarDocumentLivrare = result.Receptie.NumarDocumentLivrare;

                while (selectie.Produse.Count > 0)
                {
                    ReceptieProdus receptieProdus = selectie.Produse.First();
                    Produs existent = entities.Produse.First(element => element.ID == receptieProdus.IDProdus);

                    entities.DeleteObject(receptieProdus);
                }

                if (result.Produse != null)
                {
                    foreach (ReceptieProdus element in result.Produse)
                    {
                        Produs existent = entities.Produse.First(produs => produs.ID == element.IDProdus);
                        entities.ReceptiiProduse.AddObject(new ReceptieProdus() { Cantitate = element.Cantitate, AdmiteTVA = element.AdmiteTVA, Gramaj = element.Gramaj, PretCumparare = element.PretCumparare, IDProdus = element.IDProdus, IDReceptie = id, PretVanzare = element.PretVanzare });
                    }
                }

                entities.SaveChanges();
                return RedirectToAction("Index");
            }
        }
    }
}